home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc Development Framework / ODFDev / ODF / Framewrk / FWGadgts / Sources / FWSclBar.cpp < prev    next >
Encoding:
Text File  |  1995-11-08  |  11.3 KB  |  392 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWSclBar.cpp
  4. //    Release Version:    $ 1.0d11 $
  5. //
  6. //    Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFrameW.hpp"
  11.  
  12. #ifndef FWSCLBAR_H
  13. #include "FWSclBar.h"
  14. #endif
  15.  
  16. #if defined(FW_BUILD_MAC) && !defined(FWCONTRH_H)
  17. #include "FWContrH.h"
  18. #endif
  19.  
  20. #if defined(FW_BUILD_WIN) && !defined(FWCNTRHW_H)
  21. #include "FWCntrHW.h"
  22. #endif
  23.  
  24. #ifndef FWFRAME_H
  25. #include "FWFrame.h"
  26. #endif
  27.  
  28. #ifndef FWPART_H
  29. #include "FWPart.h"
  30. #endif
  31.  
  32. #ifndef FWSCLNOT_H
  33. #include "FWSclNot.h"
  34. #endif
  35.  
  36. // ----- OS Layer -----
  37.  
  38. #ifndef FWEVENT_H
  39. #include "FWEvent.h"
  40. #endif
  41.  
  42. #ifndef FWODGEOM_H
  43. #include "FWODGeom.h"
  44. #endif
  45.  
  46. #ifndef FWGRGLOB_H
  47. #include "FWGrGlob.h"
  48. #endif
  49.  
  50. // ----- OpenDoc Includes -----
  51.  
  52. #ifndef SOM_ODSession_xh
  53. #include <ODSessn.xh>
  54. #endif
  55.  
  56. #ifndef SOM_ODFacet_xh
  57. #include <Facet.xh>
  58. #endif
  59.  
  60. #ifndef SOM_ODTransform_xh
  61. #include <Trnsform.xh>
  62. #endif
  63.  
  64. // ----- Platform Includes -----
  65.  
  66. #if defined(FW_BUILD_MAC) && !defined(__CONTROLS__)
  67. #include <Controls.h>
  68. #endif
  69.  
  70. #ifdef FW_BUILD_WIN
  71. #include <Windows.h>
  72. #endif
  73.  
  74. //========================================================================================
  75. // Runtime Informations
  76. //========================================================================================
  77.  
  78. #if FW_LIB_EXPORT_PRAGMAS
  79. #pragma lib_export on
  80. #endif
  81.  
  82. #ifdef FW_BUILD_MAC
  83. #pragma segment fwgadgts
  84. #endif
  85.  
  86. FW_DEFINE_CLASS_M2(FW_CScrollBar, FW_CGadget, FW_MNotifier)
  87.  
  88. //========================================================================================
  89. // CLASS FW_CScrollBar
  90. //========================================================================================
  91.  
  92. //----------------------------------------------------------------------------------------
  93. // FW_CScrollBar::FW_CScrollBar
  94. //----------------------------------------------------------------------------------------
  95.  
  96. FW_CScrollBar::FW_CScrollBar(Environment* ev, 
  97.                              FW_CView* container, ODID id,
  98.                              const FW_CRect& bounds) :
  99.     FW_MNotifier(),
  100.     FW_CGadget(ev, container, id, bounds),
  101.     fScrollBarHelper(NULL),
  102.     fMinorScrollUnits(FW_IntToFixed(1)),
  103.     fMajorScrollUnits(FW_IntToFixed(1)),
  104.     fScrollNotificationToken(0)
  105. {
  106. #ifdef FW_BUILD_MAC
  107.     fScrollBarHelper = new FW_CPrivMacScrollBarHelper
  108.                                 (ev, FW_TYPEID_FROM_TYPE(FW_CPrivMacScrollBarHelper), this);
  109. #endif
  110.  
  111. #ifdef FW_BUILD_WIN
  112.     fScrollBarHelper = new FW_CPrivWinScrollBarHelper
  113.                                 (ev, FW_TYPEID_FROM_TYPE(FW_CPrivWinScrollBarHelper), this);
  114. #endif
  115.  
  116.     ODSession* session = GetFrame(ev)->GetPart(ev)->GetSession(ev);
  117.     fScrollNotificationToken = session->Tokenize(ev, FW_CScrollNotification::kName);
  118. }
  119.  
  120. //----------------------------------------------------------------------------------------
  121. // FW_CScrollBar::~FW_CScrollBar
  122. //----------------------------------------------------------------------------------------
  123.  
  124. FW_CScrollBar::~FW_CScrollBar()
  125. {
  126.     delete fScrollBarHelper;
  127. }
  128.  
  129. //----------------------------------------------------------------------------------------
  130. // FW_CScrollBar::LocationChanged
  131. //----------------------------------------------------------------------------------------
  132.  
  133. void FW_CScrollBar::LocationChanged(Environment *ev, const FW_CPoint &oldLocation)
  134. {
  135. FW_UNUSED(oldLocation);
  136.  
  137. #ifdef FW_BUILD_WIN
  138.     FW_CViewContext gc(ev, this, GetFrame(ev)->GetActiveFacet(ev));
  139.     
  140.     FW_SPlatformPoint wndLocation = gc.ContentToCanvas(FW_kZeroPoint);
  141.     FW_CPoint size = GetSize(ev);
  142.     FW_SPlatformPoint wndSize = gc.ContentToCanvas(size.x, size.y);
  143.     fScrollBarHelper->Move(wndLocation, wndSize);
  144. #endif
  145. }
  146.  
  147. //----------------------------------------------------------------------------------------
  148. // FW_CScrollBar::SizeChanged
  149. //----------------------------------------------------------------------------------------
  150.  
  151. void FW_CScrollBar::SizeChanged(Environment *ev, const FW_CPoint &oldSize)
  152. {
  153. FW_UNUSED(oldSize);
  154.  
  155. #ifdef FW_BUILD_WIN
  156.     FW_CViewContext gc(ev, this, GetFrame(ev)->GetActiveFacet(ev));
  157.     
  158.     FW_SPlatformPoint wndLocation = gc.ContentToCanvas(FW_kZeroPoint);
  159.     FW_CPoint size = GetSize(ev);
  160.     FW_SPlatformPoint wndSize = gc.ContentToCanvas(size.x, size.y);
  161.     fScrollBarHelper->Move(wndLocation, wndSize);
  162. #endif
  163. }
  164.  
  165. //----------------------------------------------------------------------------------------
  166. // FW_CScrollBar::ScrollPositionChanged
  167. //----------------------------------------------------------------------------------------
  168.  
  169. void FW_CScrollBar::ScrollPositionChanged(Environment *ev, FW_CFixed absolute, FW_CFixed delta, FW_Boolean shouldScroll)
  170. {
  171.     // ----- Figure out which direction we're scrolling
  172.     
  173.     FW_CScrollNotification::Direction direction = FW_CScrollNotification::kHorizontal;
  174.     FW_CRect bounds = GetBounds(ev);
  175.     if (bounds.Height() > bounds.Width())
  176.         direction = FW_CScrollNotification::kVertical;
  177.  
  178.     // ----- Notify interested parties of the changes in scroll position
  179.     
  180.     FW_CScrollNotification notification(FW_CInterest(this, fScrollNotificationToken),
  181.                                         direction, absolute, delta, shouldScroll);
  182.     Notify(notification);
  183. }
  184.  
  185. //----------------------------------------------------------------------------------------
  186. // FW_CScrollBar::GetDefaultScrollBarSize
  187. //----------------------------------------------------------------------------------------
  188.  
  189. FW_CPoint FW_CScrollBar::GetDefaultScrollBarSize()
  190. {
  191. #ifdef FW_BUILD_MAC
  192.     return FW_CPoint(FW_IntToFixed(15), FW_IntToFixed(15));
  193. #endif
  194. #ifdef FW_BUILD_WIN
  195.     return FW_CPoint(FW_IntToFixed(::GetSystemMetrics(SM_CXHSCROLL)),
  196.                      FW_IntToFixed(::GetSystemMetrics(SM_CXVSCROLL)));
  197. #endif
  198. }
  199.  
  200. //----------------------------------------------------------------------------------------
  201. // FW_CScrollBar::Draw
  202. //----------------------------------------------------------------------------------------
  203.  
  204. void FW_CScrollBar::Draw(Environment *ev, ODFacet* facet, ODShape* invalidShape)
  205. {
  206. #ifdef FW_BUILD_MAC
  207.     FW_CViewContext gc(ev, this, facet, invalidShape);
  208.  
  209.     FW_SPlatformPoint qdPoint = gc.LogicalToDevice(FW_kZeroPoint);
  210.     FW_SPlatformPoint qdSize;
  211.     GetSize(ev).AsPlatformPoint(qdSize);
  212.     ODPlatformWindow window = facet->GetWindow(ev)->GetPlatformWindow(ev);
  213.     fScrollBarHelper->Draw(window, qdPoint, qdSize);
  214. #endif
  215.  
  216. #ifdef FW_BUILD_WIN
  217.     FW_UNUSED(facet); 
  218.     FW_UNUSED(invalidShape);
  219.     // Windows handles updating controls automatically
  220. #endif
  221. }
  222.  
  223. //----------------------------------------------------------------------------------------
  224. // FW_CScrollBar::DoActivateEvent
  225. //----------------------------------------------------------------------------------------
  226.  
  227. FW_Boolean    FW_CScrollBar::DoActivateEvent(Environment *ev, 
  228.                                         const FW_CActivateEvent& theActivateEvent)
  229. {
  230. #ifdef FW_BUILD_MAC
  231.     ODFacet* facet = theActivateEvent.GetFacet(ev);
  232.     FW_CViewContext gc(ev, this, facet);
  233.  
  234.     FW_SPlatformPoint qdPoint = gc.LogicalToDevice(FW_kZeroPoint);
  235.     FW_SPlatformPoint qdSize;
  236.     GetSize(ev).AsPlatformPoint(qdSize);
  237.     ODPlatformWindow window = facet->GetWindow(ev)->GetPlatformWindow(ev);
  238.  
  239.     if (theActivateEvent.IsActivating(ev)) {
  240.         fScrollBarHelper->Show(window, qdPoint, qdSize);    
  241.     }
  242.     else {
  243.         fScrollBarHelper->Hide(window, qdPoint, qdSize);
  244.     }
  245.     
  246. #endif
  247.  
  248. #ifdef FW_BUILD_WIN
  249.     // [LSD] to do
  250. #endif
  251.     return FALSE;    // let other views handle activate events
  252. }
  253.  
  254. //----------------------------------------------------------------------------------------
  255. // FW_CScrollBar::DoMouseDown
  256. //----------------------------------------------------------------------------------------
  257.  
  258. FW_Boolean FW_CScrollBar::DoMouseDown(Environment *ev, const FW_CMouseEvent& theMouseEvent)
  259. {
  260. #ifdef FW_BUILD_MAC
  261.     ODFacet* odFacet = theMouseEvent.GetFacet(ev);
  262.     FW_CViewContext gc(ev, this, odFacet);
  263.     
  264.     FW_CPoint canvasWhere = theMouseEvent.GetMousePosition(ev, FW_CMouseEvent::kWindow);
  265.     
  266.     {
  267.         // Take into account the origin offset for pattern alignment. [AMB]
  268.         FW_CAcquiredODTransform aqTransform(odFacet->CreateTransform(ev));
  269.  
  270.         ODPlatformCanvas plfmCanvas = gc.GetPlatformCanvas();
  271.         FW_CPoint offset(
  272.             FW_IntToFixed(plfmCanvas->portRect.left),
  273.             FW_IntToFixed(plfmCanvas->portRect.top));
  274.         
  275.         ODPoint odOffset = offset;
  276.         aqTransform->MoveBy(ev, &odOffset);
  277.         
  278.         canvasWhere.Transform(ev, aqTransform);
  279.     }
  280.     
  281.     FW_SPlatformPoint qdControlPosition = gc.LogicalToDevice(FW_kZeroPoint);
  282.     FW_SPlatformPoint qdWhere;
  283.     canvasWhere.AsPlatformPoint(qdWhere);
  284.     ODPlatformWindow window = odFacet->GetWindow(ev)->GetPlatformWindow(ev);    
  285.     
  286.     FW_SPlatformPoint qdSize;
  287.     GetSize(ev).AsPlatformPoint(qdSize);
  288.  
  289.     fScrollBarHelper->MouseDown(window, qdWhere, qdControlPosition, qdSize);
  290.     return TRUE;
  291. #endif
  292.  
  293. #ifdef FW_BUILD_WIN
  294. FW_UNUSED(theMouseEvent);
  295.     // Windows handles mouse events automatically
  296.     return FALSE;
  297. #endif
  298. }
  299.  
  300. //----------------------------------------------------------------------------------------
  301. // FW_CScrollBar::SetMinorScrollUnits
  302. //----------------------------------------------------------------------------------------
  303.  
  304. void FW_CScrollBar::SetMinorScrollUnits(Environment *ev, FW_CFixed units)
  305. {
  306.     fMinorScrollUnits = units;
  307. }
  308.  
  309. //----------------------------------------------------------------------------------------
  310. // FW_CScrollBar::SetMajorScrollUnits
  311. //----------------------------------------------------------------------------------------
  312.  
  313. void FW_CScrollBar::SetMajorScrollUnits(Environment *ev, FW_CFixed units)
  314. {
  315.     fMajorScrollUnits = units;
  316. }
  317.  
  318. //----------------------------------------------------------------------------------------
  319. // FW_CScrollBar::SetScrollMax
  320. //----------------------------------------------------------------------------------------
  321.  
  322. void FW_CScrollBar::SetScrollMax(Environment *ev, FW_CFixed units)
  323. {
  324.     FW_ASSERT(fScrollBarHelper);
  325.     
  326. #ifdef FW_BUILD_MAC
  327.     fScrollBarHelper->SetMax(units.AsInt());
  328. #endif
  329.  
  330. #ifdef FW_BUILD_WIN
  331.     int min, max;
  332.     fScrollBarHelper->GetScrollRange(min, max);
  333.     fScrollBarHelper->SetScrollRange(min, units.AsInt());
  334. #endif
  335. }
  336.  
  337. //----------------------------------------------------------------------------------------
  338. // FW_CScrollBar::SetScrollMin
  339. //----------------------------------------------------------------------------------------
  340.  
  341. void FW_CScrollBar::SetScrollMin(Environment *ev, FW_CFixed units)
  342. {
  343.     FW_ASSERT(fScrollBarHelper);
  344.  
  345. #ifdef FW_BUILD_MAC
  346.     fScrollBarHelper->SetMin(units.AsInt());
  347. #endif
  348.  
  349. #ifdef FW_BUILD_WIN
  350.     int min, max;
  351.     fScrollBarHelper->GetScrollRange(min, max);
  352.     fScrollBarHelper->SetScrollRange(units.AsInt(), max);
  353. #endif
  354. }
  355.  
  356. //----------------------------------------------------------------------------------------
  357. // FW_CScrollBar::SetScrollPos
  358. //----------------------------------------------------------------------------------------
  359.  
  360. void FW_CScrollBar::SetScrollPos(Environment *ev, FW_CFixed units)
  361. {
  362.     FW_ASSERT(fScrollBarHelper);
  363.  
  364. #ifdef FW_BUILD_MAC
  365.     fScrollBarHelper->SetValue(units.AsInt());
  366. #endif
  367.  
  368. #ifdef FW_BUILD_WIN
  369.     fScrollBarHelper->SetScrollPos(units.AsInt());
  370. #endif
  371. }
  372.  
  373. //----------------------------------------------------------------------------------------
  374. // FW_CScrollBar::SetScrollPos
  375. //----------------------------------------------------------------------------------------
  376.  
  377. void FW_CScrollBar::SetScrollPos(Environment *ev, FW_CFixed range, FW_CFixed pos)
  378. {
  379.     FW_ASSERT(fScrollBarHelper);
  380.  
  381.     FW_CFixed units = 
  382.         FW_WideMultiply(GetScrollMax(ev) - GetScrollMin(ev), pos) / range + GetScrollMin(ev);
  383.  
  384. #ifdef FW_BUILD_MAC
  385.     fScrollBarHelper->SetValue(units.AsInt());
  386. #endif
  387.  
  388. #ifdef FW_BUILD_WIN
  389.     fScrollBarHelper->SetScrollPos(units.AsInt());
  390. #endif
  391. }
  392.